S3のACLの非推奨になったのでBucketPolicyへ移行してみた
はじめに
Amazon S3のAccess Control List (ACL)が非推奨となることが2021年に発表されました。
これに伴い、とある業務でCloudFormationを使った、ACLからバケットポリシーへの権限委譲を行いましたので、どのような対応をしたか紹介します。
S3ログ配信グループの権限移譲手順
現状の確認
まず初めに、現在のACL設定を確認し、どのようにアクセス制御が行われているかを把握します。
バケットポリシー
→何も設定されていません。
ACL
→S3ログ配信グループにオブジェクトの書き込み権限が付与されています。この権限を利用し、ログを受信しています。
権限の移譲方針について
ACLからバケットポリシーに権限を移譲する方針を記載します。
全体のイメージとして、cm-sample-bucketバケットに対してアクセスした結果のログを、S3のログ配信機能を利用し、s3-access-log-depositoryに保管します。
バケットACLの読み、書きに関する権限は、バケットポリシーを使うので引き継ぐ必要はありません。
ACL無効化後、バケット所有者は、オブジェクトの書き込み、リスト(読み込み)の権限をデフォルトで付与されます。
バケットポリシーに記載するのは、必須ではないですが、明示的に記載することで保守性を高めます。
参考:オブジェクトの所有権の制御とバケットの ACL の無効化
CloudFormationテンプレートの準備
次にCloudFormationテンプレートを使用してBucketPolicyを設定します。
cm-sample-bucket
)
ユーザがアクセスするS3バケット (AWSTemplateFormatVersion: "2010-09-09"
Description: Access by users and cli
Resources:
SampleBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: cm-sample-bucket
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: "AES256"
LoggingConfiguration:
DestinationBucketName: s3-access-log-depository
LogFilePrefix: "cm-sample-bucket-log/"
Outputs:
SampleBucket:
Value: !Ref SampleBucket
解説
-
PublicAccessBlockConfiguration
は、パブリックアクセスに関する設定項目です。 -
BucketEncryption
は、暗号化に関する設定項目です。 -
LoggingConfiguration
は、ログの配信先の設定項目です。LoggingConfiguration: DestinationBucketName: s3-access-log-depository LogFilePrefix: "cm-sample-bucket-log/"
ログの配信先を
s3://s3-access-log-depository/cm-sample-bucket-log/
に設定しています。s3-access-log-depositoryバケットが作成されたあと、 cm-sample-bucketバケットを作成してください。
s3-access-log-depository
)
ログを配信するS3バケット (AWSTemplateFormatVersion: "2010-09-09"
Description: S3 Access log depository
Resources:
S3AccessLogDepositoryBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: "s3-access-log-depository"
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: "AES256"
S3AccessLogDepositoryBucketPolicy:
Type: 'AWS::S3::BucketPolicy'
Properties:
Bucket: !Ref S3AccessLogDepositoryBucket
PolicyDocument:
Version: 2012-10-17
Statement:
- Sid: BucketOwnerWrite
Effect: Allow
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
Action:
- s3:ListBucket
- s3:PutObject
Resource:
- "arn:aws:s3:::s3-access-log-depository"
- "arn:aws:s3:::s3-access-log-depository/*"
- Sid: AWSS3LogWrite
Effect: Allow
Principal:
Service: 'logging.s3.amazonaws.com'
Action: 's3:PutObject'
Resource: "arn:aws:s3:::s3-access-log-depository/*"
Outputs:
S3AccessLogDepositoryBucket:
Value: !Ref S3AccessLogDepositoryBucket
S3AccessLogDepositoryBucketPolicy:
Value: !Ref S3AccessLogDepositoryBucketPolicy
解説
- Sid: BucketOwnerWrite
Effect: Allow
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
Action:
- s3:ListBucket
- s3:PutObject
Resource:
- "arn:aws:s3:::s3-access-log-depository"
- "arn:aws:s3:::s3-access-log-depository/*"
ACLのバケット所有者と同じ権限を、バケットポリシーでも付与しています。
ACL無効化後、デフォルトで付与される権限ですが、保守性の観点から明示的に記載しています。
- Sid: AWSS3LogWrite
Effect: Allow
Principal:
Service: 'logging.s3.amazonaws.com'
Action: 's3:PutObject'
Resource: "arn:aws:s3:::s3-access-log-depository/*"
S3ログ配信グループに、s3-access-log-depositoryバケットへの書き込み権限を付与しています。
これにより、バケットポリシーでログを受信できるようになります。
検証と確認
CloudFormationのデプロイ
デプロイ成功です。
ログ保存の確認
テンプレートを適用した後、S3ログ配信グループにログが正しく保存されていることを確認します。これには、AWSコンソールを使用してバケットの内容を確認するか、AWS CLIを使用してログファイルの存在をチェックする方法があります。
今回は以下のスクリプトを実行しました。
aws s3 ls cm-sample-bucket
バケットポリシー移行後に、ログが受信されていることがわかります。
結論
まとめ
S3のACLからBucketPolicyへの移行は、セキュリティと管理性を向上させるための重要な今後のメンテナンスやセキュリティ向上のために、BucketPolicyの設定を定期的に見直すことをお勧めします。